#include "List.h"
#include "LE.h"

void List::setElementAt(int index, Node* node) {
	LE* newPtr = first;
	if (index >= 0 && index < size) {
		for (int i = 1; i <= index; i++) {
			newPtr = newPtr->next;
		}
		newPtr->child = node;
	} else {
		throw "Nee, eigentlich net!!!";
	}
}

Node* List::getElementAt(int index) {
	Node* value = 0;
	LE* newPtr = first;
	if (index >= 0 && index < size) {
		for (int i = 1; i <= index; i++) {
			newPtr = newPtr->next;
		}
		value = newPtr->child;
	} else {
		throw "Nee, eigentlich net!!!";
	}
	return value;
}

int List::getSize() {
	return size;
}
/**
 * Eine neue, leere List erzeugen.
 * Die Liste ist leer, wenn first
 * auf kein Element (0) verweist.
 */
List::List() {
	size = 0;
	first = 0;
	last = 0;
}

/**
 * Die Liste fordert in append selbst Speicher
 * an, der hier vor dem Löschen eines Listenobjektes
 * wieder frei gegeben wird.
 */
List::~List() {
	while (first != 0)
		removeFirst();
}

/**
 * Ein neues Element an das Ende der Liste
 * anhängen.
 */
void List::append(Node* node) {
	size++;
	// Ein neues Listenelemente für den Wert erzeugen.
	// Das neue Element hat keinen Nachfolger.
	LE* newLE = new LE(node, 0, this->last);

	// Wenn die Liste leer ist, wird das neue
	// Listenelement das erste der Liste.
	if (first == 0)
		first = newLE;
	// Sonst wird das neue Element hinter das
	// bisher letzte Element gehüngt.
	else
		last->next = newLE;

	// Das neue Listenelement ist das letzte der
	// der Liste.
	last = newLE;
}

/**
 * Das letzte Listenelement löschen.
 */
void List::removeFirst() {

	// Nur wenn die Liste nicht leer ist, wird
	// gelöscht...
	if (first != 0) {
		size--;
		// Nachfolger des zu ersten Elementes merkern.
		LE* nextFirstLE = first->next;

		// Erstes Element löschen
		delete first;

		// Gemerkter Nachfolger wird erstes Element
		first = nextFirstLE;

		// Wenn die Liste aus nur einem Element bestand,
		// dann ist sie jetzt leer.
		if (first == 0)
			last = 0;
	}
}
